package be.ipl.finito.usecasesimpl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Startup;

import be.ipl.finito.dao.ParticipationDao;
import be.ipl.finito.dao.PartieDao;
import be.ipl.finito.domaine.Jeton;
import be.ipl.finito.domaine.Joueur;
import be.ipl.finito.domaine.Participation;
import be.ipl.finito.domaine.Partie;
import be.ipl.finito.exceptions.BizException;
import be.ipl.finito.exceptions.FinDePartieException;
import be.ipl.finito.usecases.GestionParticipations;
import be.ipl.finito.util.Util;

@Singleton
@Startup
public class GestionParticipationsImpl implements GestionParticipations {

	@EJB
	ParticipationDao participationDao;

	@EJB
	PartieDao partieDao;

	private Map<Participation, Boolean> changedState = new HashMap<Participation, Boolean>();

	@Override
	public Participation poserJeton(Participation part, Jeton jetonP,
			int indiceCase) throws BizException {
		Util.checkObject(part);
		Util.checkObject(jetonP);
		Util.checkPositiveOrZero(indiceCase);
		part = participationDao.rechercher(part.getId());
		if (part.getJetonsAPlacer().size() == 0) {
			part.deplacerJeton(jetonP, indiceCase);
		} else {
			part.poserJeton(jetonP, indiceCase);
		}
		part.setTourJoue(true);
		participationDao.mettreAJour(part);

		Partie p = partieDao.rechercher(part.getPartie().getId());
		boolean tourJoue = true;
		for (Joueur j : p.getJoueurs()) {
			tourJoue = tourJoue && p.getParticipation(j).getTourJoue();
		}
		if (tourJoue) {
			p.commencerTourSuivant();
			for (Joueur j : p.getJoueurs()) {
				Participation pa = p.getParticipation(j);
				participationDao.rechercher(pa.getId());
				p.getParticipation(j).setTourJoue(false);
				changedState.put(pa, true);
				participationDao.mettreAJour(p.getParticipation(j));
			}

			partieDao.mettreAJour(p);
		}
		return part;
	}

	@Override
	public Participation ajouteJetonJouable(Participation participation, Jeton j)
			throws BizException {
		Util.checkObject(participation);
		Util.checkObject(j);
		participation = participationDao.rechercher(participation.getId());
		participation.ajouterJetonJouable(j);
		participationDao.mettreAJour(participation);
		return participation;
	}

	@Override
	public Participation calculerScore(Participation part) throws BizException {
		Util.checkObject(part);
		part = participationDao.rechercher(part.getId());
		part.calculerScore();
		participationDao.mettreAJour(part);
		return part;
	}

	@Override
	public List<Jeton> getJetonsAPlacer(Participation part) throws BizException {
		Util.checkObject(part);
		part = participationDao.rechercher(part.getId());
		return part.getJetonsAPlacer();
	}

	@Override
	public List<Jeton> renvoieListeCases(Participation part)
			throws BizException {
		Util.checkObject(part);
		part = participationDao.rechercher(part.getId());
		return part.renvoieListeCases();
	}

	@Override
	public boolean getStateChanged(Participation part) {

		Boolean b = changedState.get(part);
		b = (b != null) && b;
		changedState.put(part, false);
		return b;
	}
}
